{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training a Binary model to solve a convex optimization problem"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this notebook we consider the following optimization problem :\n",
    "\n",
    "$$ \\mathcal{L}(\\theta) = \\frac{1}{2}(\\theta - \\theta^{*})^{T}H (\\theta - \\theta^{*})$$\n",
    "\n",
    "$$ -\\frac{\\partial \\mathcal{L}}{\\partial \\theta} = - H (\\theta - \\theta^{*})$$\n",
    "\n",
    "$$ \\theta_{t+1} = \\theta_{t} - \\eta H (sign_{\\mathcal{CB}}(\\theta_{t}) - \\theta^{*}) $$\n",
    "\n",
    "With $H$ a positive symmetric definite matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "from matplotlib import rc, rcParams\n",
    "from matplotlib import cm\n",
    "from matplotlib.colors import LinearSegmentedColormap\n",
    "from IPython.display import HTML\n",
    "\n",
    "rcParams['axes.linewidth'] = 4\n",
    "rcParams['xtick.labelsize'] = 40\n",
    "rcParams['ytick.labelsize'] = 40\n",
    "rcParams['axes.titlesize'] = 40\n",
    "rcParams['axes.labelsize'] = 35\n",
    "rcParams['lines.markersize'] = 2\n",
    "rcParams.update({'figure.autolayout': True})\n",
    "rc('text', usetex=True)                         # r\"$...$\" for latex string"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Functions needed for the toy problem\n",
    "\n",
    "def cost(H, theta, theta_star):\n",
    "    \"\"\"\n",
    "    cost computes the loss associated with the parameter theta in a landscape defined by H and theta_star\n",
    "    H : PSD matrix of dimensions d x d\n",
    "    theta : parameter column vector (d, 1)\n",
    "    theta_star : global optimum vector (d, 1)\n",
    "    \"\"\"\n",
    "    assert(H.size(0)==H.size(1))\n",
    "    assert(H.size(0)==theta.size(0))\n",
    "    assert(theta.size()==theta_star.size())\n",
    "    \n",
    "    diff = theta-theta_star\n",
    "    return 0.5*torch.mm(diff.t(), torch.mm(H,diff)).sum().item()\n",
    "\n",
    "def cost_map(H, x, y, theta_star):\n",
    "    \"\"\"\n",
    "    cost_map returns the square numpy array containing cost values to generate the colormap\n",
    "    it computes the cost of each 2D parameter made of first component in x and second component in y\n",
    "    \"\"\"\n",
    "    assert(H.size(0)==H.size(1))\n",
    "    assert(H.size(0)==theta_star.size(0))\n",
    "    assert(theta_star.size(0)==2)\n",
    "    \n",
    "    size = x.shape[0]\n",
    "    theta_x = torch.tensor(x, dtype=torch.float32).view(1,-1)\n",
    "    theta_y = torch.tensor(y, dtype=torch.float32).view(1,-1)\n",
    "    theta = torch.cat([theta_x, theta_y], dim =0).view(2,-1)\n",
    "    diff = theta-theta_star\n",
    "    return 0.5*torch.mm(diff.t(), torch.mm(H,diff)).diag().view(size,size).numpy()\n",
    "\n",
    "def gradient(H, theta, theta_star):\n",
    "    \"\"\"\n",
    "    Computes the gradient associated with parameter theta\n",
    "    \"\"\"\n",
    "    assert(H.size(0)==H.size(1))\n",
    "    assert(H.size(0)==theta.size(0))\n",
    "    assert(theta.size()==theta_star.size())    \n",
    "    \n",
    "    diff = theta-theta_star\n",
    "    return torch.mm(H, diff)\n",
    "\n",
    "def step_sgd(H, theta, theta_star, lr = 0.1):\n",
    "    \"\"\"\n",
    "    Computes the hidden parameter theta after one step of gradient descent applied to the binarized parameter\n",
    "    \"\"\"\n",
    "    assert(H.size(0)==H.size(1))\n",
    "    assert(H.size(0)==theta.size(0))\n",
    "    assert(theta.size()==theta_star.size())    \n",
    "    \n",
    "    bin_theta = theta.sign()   # Binarized parameter\n",
    "    \n",
    "    theta -= lr*gradient(H, bin_theta, theta_star)\n",
    "    return theta\n",
    " \n",
    "def coor(theta):\n",
    "    \"\"\"\n",
    "    returns the tuple of coordinates for 2D use\n",
    "    \"\"\"\n",
    "    assert(theta.size()==torch.empty(2,1).size())\n",
    "    theta = theta.view(2,1)\n",
    "    return theta[0,0].item(), theta[1,0].item()\n",
    "\n",
    "def H_product_BC(H, x, y):\n",
    "    \"\"\"\n",
    "    Computes the scalar product defined by PSD matrix H\n",
    "    \"\"\"\n",
    "    assert(H.t()==H)\n",
    "    assert(H.size(0)==x.size(0))\n",
    "    assert(x.size()==y.size())\n",
    "    \n",
    "    return torch.mm(x.t(), torch.mm(H,y)).item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "theta_star = tensor([[1.5000, 0.5000]])\n",
      "\n",
      "theta_initial = tensor([[0.0100, 0.0200]])\n",
      "\n",
      "H = tensor([[2.4047, 0.2158],\n",
      "        [0.2158, 0.7733]])\n",
      "\n",
      "eig_val = tensor([0.7452, 2.4328])\n",
      "\n",
      "eig_vec = tensor([[ 0.1290, -0.9916],\n",
      "        [-0.9916, -0.1290]])\n"
     ]
    }
   ],
   "source": [
    "# Case where H eigen axis are random\n",
    "dim = 2\n",
    "num_epochs = 500\n",
    "torch.manual_seed(11)\n",
    "\n",
    "init_coor = [0.01, 0.02]\n",
    "theta = torch.tensor(init_coor, dtype=torch.float32).view(2,1)\n",
    "theta_initial = torch.tensor(init_coor, dtype=torch.float32).view(2,1)\n",
    "theta_star = torch.tensor([1.5, 0.5], dtype=torch.float32).view(2,1)\n",
    "\n",
    "print('\\ntheta_star =', theta_star.t())\n",
    "print('\\ntheta_initial =', theta_initial.t())\n",
    "\n",
    "D = torch.diag(5*torch.rand(dim))\n",
    "u = torch.randn((dim,1))\n",
    "t = 2/torch.mm(u.t(), u).item()\n",
    "A = torch.eye(dim)-t*torch.mm(u,u.t())\n",
    "H = torch.mm(A,torch.mm(D,A))\n",
    "\n",
    "print('\\nH =', H)\n",
    "eig_val, eig_vec = torch.symeig(H, eigenvectors=True)\n",
    "print('\\neig_val =', eig_val)\n",
    "print('\\neig_vec =', eig_vec)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "traj_x = []\n",
    "traj_y = []\n",
    "\n",
    "cube_x = [1.0,1.0,-1.0,-1.0]\n",
    "cube_y = [1.0,-1.0,-1.0,1.0]\n",
    "\n",
    "\n",
    "for t in range(num_epochs):\n",
    "    theta = step_sgd(H, theta, theta_star, lr=0.35)   \n",
    "    traj_x.append(theta[0,0].item())\n",
    "    traj_y.append(theta[1,0].item())\n",
    "\n",
    "\n",
    "\n",
    "    \n",
    "plt.figure(figsize=(9,10))\n",
    "\n",
    "\n",
    "ts_x, ts_y = coor(theta_star)\n",
    "ti_x, ti_y = coor(theta_initial)\n",
    "tb_x, tb_y = coor(theta.sign())\n",
    "\n",
    "\n",
    "zoom = 4.5\n",
    "\n",
    "\n",
    "# Colormap of the landscape\n",
    "x , y = np.meshgrid(np.linspace(-zoom,zoom,100),np.linspace(-zoom,zoom,100))\n",
    "z = cost_map(H, x, y, theta_star)\n",
    "cmap0 = LinearSegmentedColormap.from_list('cmap0', ['white', 'orangered','firebrick', 'saddlebrown'])\n",
    "landscape = plt.contourf(x, y, z, 30, cmap=cmap0, colors=None)\n",
    "\n",
    "# Relevant points\n",
    "plt.scatter(traj_x, traj_y, s=10.0, label='traj', alpha=1.0)                 # Trajectory of hidden weights\n",
    "plt.scatter(ts_x, ts_y, s=50.0, marker='*', color ='r')                      # Global optimum\n",
    "plt.scatter(ti_x, ti_y, s=50.0, color='b')                                   # Initial values of the hidden weights\n",
    "plt.scatter(np.sign(traj_x[9]), np.sign(traj_y[9]), s=50.0, color='black')   # Binary weights\n",
    "\n",
    "# Arrows for hidden weights trajectory\n",
    "for idx in range(4):\n",
    "    plt.arrow(cube_x[idx], cube_y[idx], cube_x[idx-1]-cube_x[idx], cube_y[idx-1]-cube_y[idx], linewidth=1)\n",
    "\n",
    "# Lines for the inifinite norm unit ball \n",
    "plt.arrow(ti_x, ti_y, 0.3*(traj_x[0]-ti_x), 0.3*(traj_y[0]-ti_y), color='b', head_length=.2, head_width=.1)\n",
    "for t in range(len(traj_x)-1):\n",
    "    plt.arrow(traj_x[t], traj_y[t], 0.3*(traj_x[t+1]-traj_x[t]), 0.3*(traj_y[t+1]-traj_y[t]), color='b', head_length=.2, head_width=.1)\n",
    "    \n",
    "\n",
    "    \n",
    "# Text, may have to be tuned for other settings\n",
    "plt.text(ts_x+0.5, ts_y+0.2, r'$W^{*}$', horizontalalignment='center', fontsize=35, color='r')\n",
    "plt.text(ti_x, ti_y+0.1, r'$W_{0}^{{\\rm h}}$', horizontalalignment='center', fontsize=35, color='b')\n",
    "plt.text(traj_x[9]-0.1, traj_y[9]+0.2, r'$W_{T}^{{\\rm h}}$', horizontalalignment='center', fontsize=35, color='b')\n",
    "plt.text(np.sign(traj_x[9]), np.sign(traj_y[9])+0.2, r'${\\rm sign}(W_{T}^{{\\rm h}})$', horizontalalignment='center', fontsize=30)\n",
    "plt.text(-1.1, 1.1, r'$\\mathcal{B}_{\\infty}$', horizontalalignment='center', fontsize=40)\n",
    "plt.text(-zoom-1.5, 0.5+zoom, r'(a)', horizontalalignment='center', fontsize=35)\n",
    "plt.text(0.0, -1.5-zoom, r'$W^{{\\rm h}}_{x}$ Parameter', horizontalalignment='center', fontsize=35)\n",
    "plt.text(-1.5-zoom, -1.7, r'$W^{{\\rm h}}_{y}$ Parameter', horizontalalignment='center', fontsize=35, rotation = 90)\n",
    "\n",
    "\n",
    "# Axes properties\n",
    "axes = plt.gca()\n",
    "label_pad = 5\n",
    "\n",
    "axes.set_xlim(-zoom, zoom)\n",
    "axes.xaxis.set_ticks(range(-int(zoom),int(zoom+1)))\n",
    "axes.xaxis.set_tick_params(direction = 'in', labelsize = 35, length = 10, width = 4, top = True, bottom = True, pad = label_pad, which = 'major')\n",
    "axes.xaxis.set_tick_params(direction = 'in', labelsize = 35, length = 6, width = 3, top = True, bottom = True, pad = label_pad, which = 'minor')\n",
    "\n",
    "axes.set_ylim(-zoom, zoom)\n",
    "axes.yaxis.set_ticks(range(-int(zoom),int(zoom+1)))\n",
    "axes.yaxis.set_tick_params(direction = 'in', labelsize = 35, length = 10, width = 4, right = True, left = True, pad = label_pad, which='major')\n",
    "axes.yaxis.set_tick_params(direction = 'in', labelsize = 35, length = 6, width = 3, right = True, left = True, pad = label_pad, which='minor')\n",
    "\n",
    "#plt.savefig('traj_2D.png', format='png', dpi =300)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n= 3   -->   det(R) = 1.0\n",
      "n= 4   -->   det(R) = -1.0\n",
      "n= 5   -->   det(R) = 1.0\n",
      "n= 6   -->   det(R) = -0.9999997019767761\n",
      "n= 7   -->   det(R) = 0.9999997019767761\n",
      "n= 8   -->   det(R) = -1.0000001192092896\n",
      "n= 9   -->   det(R) = 1.0\n",
      "n= 10   -->   det(R) = -1.0000003576278687\n",
      "n= 11   -->   det(R) = 1.0000004768371582\n",
      "n= 12   -->   det(R) = -1.0000004768371582\n",
      "n= 13   -->   det(R) = 1.000000238418579\n",
      "n= 14   -->   det(R) = -1.000000238418579\n",
      "n= 15   -->   det(R) = 1.0000003576278687\n",
      "n= 16   -->   det(R) = -1.0000003576278687\n",
      "n= 17   -->   det(R) = 0.9999995231628418\n",
      "n= 18   -->   det(R) = -0.9999996423721313\n",
      "n= 19   -->   det(R) = 0.9999992847442627\n",
      "n= 20   -->   det(R) = -1.0\n",
      "n= 21   -->   det(R) = 1.0000001192092896\n",
      "n= 22   -->   det(R) = -1.0000001192092896\n",
      "n= 23   -->   det(R) = 0.9999999403953552\n",
      "n= 24   -->   det(R) = -1.0000004768371582\n",
      "n= 25   -->   det(R) = 1.0000003576278687\n",
      "n= 26   -->   det(R) = -1.0000003576278687\n",
      "n= 27   -->   det(R) = 1.0\n",
      "n= 28   -->   det(R) = -1.0000003576278687\n",
      "n= 29   -->   det(R) = 1.000001072883606\n",
      "n= 30   -->   det(R) = -1.0000014305114746\n",
      "n= 31   -->   det(R) = 1.0000008344650269\n",
      "n= 32   -->   det(R) = -1.000001311302185\n",
      "n= 33   -->   det(R) = 1.0000014305114746\n",
      "n= 34   -->   det(R) = -1.0000011920928955\n",
      "n= 35   -->   det(R) = 1.0000008344650269\n",
      "n= 36   -->   det(R) = -1.0000007152557373\n",
      "n= 37   -->   det(R) = 1.0000004768371582\n",
      "n= 38   -->   det(R) = -1.0000005960464478\n",
      "n= 39   -->   det(R) = 1.0000009536743164\n",
      "n= 40   -->   det(R) = -1.0000008344650269\n",
      "n= 41   -->   det(R) = 1.0\n",
      "n= 42   -->   det(R) = -1.0000001192092896\n",
      "n= 43   -->   det(R) = 1.0000005960464478\n",
      "n= 44   -->   det(R) = -1.0000009536743164\n",
      "n= 45   -->   det(R) = 1.0000015497207642\n",
      "n= 46   -->   det(R) = -1.0000007152557373\n",
      "n= 47   -->   det(R) = 1.000001311302185\n",
      "n= 48   -->   det(R) = -1.0000011920928955\n",
      "n= 49   -->   det(R) = 1.0000011920928955\n",
      "n= 50   -->   det(R) = -1.000001311302185\n",
      "n= 51   -->   det(R) = 1.0000007152557373\n",
      "n= 52   -->   det(R) = -1.0000020265579224\n",
      "n= 53   -->   det(R) = 1.0000009536743164\n",
      "n= 54   -->   det(R) = -1.0000009536743164\n",
      "n= 55   -->   det(R) = 1.0000009536743164\n",
      "n= 56   -->   det(R) = -1.0000005960464478\n",
      "n= 57   -->   det(R) = 0.9999997019767761\n",
      "n= 58   -->   det(R) = -1.0000005960464478\n",
      "n= 59   -->   det(R) = 1.0000005960464478\n",
      "n= 60   -->   det(R) = -1.000001311302185\n",
      "n= 61   -->   det(R) = 0.9999997615814209\n",
      "n= 62   -->   det(R) = -0.9999994039535522\n",
      "n= 63   -->   det(R) = 0.9999998211860657\n",
      "n= 64   -->   det(R) = -0.9999993443489075\n",
      "n= 65   -->   det(R) = 0.9999998807907104\n",
      "n= 66   -->   det(R) = -0.9999995231628418\n",
      "n= 67   -->   det(R) = 0.9999997019767761\n",
      "n= 68   -->   det(R) = -1.0000007152557373\n",
      "n= 69   -->   det(R) = 0.9999989867210388\n",
      "n= 70   -->   det(R) = -0.9999995827674866\n",
      "n= 71   -->   det(R) = 1.0000001192092896\n",
      "n= 72   -->   det(R) = -1.0000004768371582\n",
      "n= 73   -->   det(R) = 1.0000001192092896\n",
      "n= 74   -->   det(R) = -0.9999999403953552\n",
      "n= 75   -->   det(R) = 1.0000004768371582\n",
      "n= 76   -->   det(R) = -1.0\n",
      "n= 77   -->   det(R) = 1.000001072883606\n",
      "n= 78   -->   det(R) = -1.0000007152557373\n",
      "n= 79   -->   det(R) = 1.0000014305114746\n",
      "n= 80   -->   det(R) = -1.0000009536743164\n",
      "n= 81   -->   det(R) = 1.0000016689300537\n",
      "n= 82   -->   det(R) = -1.0000008344650269\n",
      "n= 83   -->   det(R) = 1.0000017881393433\n",
      "n= 84   -->   det(R) = -1.0000003576278687\n",
      "n= 85   -->   det(R) = 1.0000009536743164\n",
      "n= 86   -->   det(R) = -1.0000028610229492\n",
      "n= 87   -->   det(R) = 1.0000019073486328\n",
      "n= 88   -->   det(R) = -1.0000040531158447\n",
      "n= 89   -->   det(R) = 1.0000032186508179\n",
      "n= 90   -->   det(R) = -1.0000030994415283\n",
      "n= 91   -->   det(R) = 1.0000033378601074\n",
      "n= 92   -->   det(R) = -1.0000040531158447\n",
      "n= 93   -->   det(R) = 1.0000046491622925\n",
      "n= 94   -->   det(R) = -1.0000048875808716\n",
      "n= 95   -->   det(R) = 1.0000041723251343\n",
      "n= 96   -->   det(R) = -1.000004768371582\n",
      "n= 97   -->   det(R) = 1.0000039339065552\n",
      "n= 98   -->   det(R) = -1.0000033378601074\n",
      "n= 99   -->   det(R) = 1.0000033378601074\n",
      "n= 100   -->   det(R) = -1.0000038146972656\n",
      "n= 101   -->   det(R) = 1.0000041723251343\n",
      "n= 102   -->   det(R) = -1.0000041723251343\n",
      "n= 103   -->   det(R) = 1.0000046491622925\n",
      "n= 104   -->   det(R) = -1.000004529953003\n",
      "n= 105   -->   det(R) = 1.0000050067901611\n",
      "n= 106   -->   det(R) = -1.0000041723251343\n",
      "n= 107   -->   det(R) = 1.000004768371582\n",
      "n= 108   -->   det(R) = -1.0000038146972656\n",
      "n= 109   -->   det(R) = 1.0000057220458984\n",
      "n= 110   -->   det(R) = -1.0000035762786865\n",
      "n= 111   -->   det(R) = 1.000003457069397\n",
      "n= 112   -->   det(R) = -1.0000041723251343\n",
      "n= 113   -->   det(R) = 1.0000030994415283\n",
      "n= 114   -->   det(R) = -1.0000026226043701\n",
      "n= 115   -->   det(R) = 1.0000035762786865\n",
      "n= 116   -->   det(R) = -1.0000039339065552\n",
      "n= 117   -->   det(R) = 1.000003695487976\n",
      "n= 118   -->   det(R) = -1.0000029802322388\n",
      "n= 119   -->   det(R) = 1.0000038146972656\n",
      "n= 120   -->   det(R) = -1.0000035762786865\n",
      "n= 121   -->   det(R) = 1.0000033378601074\n",
      "n= 122   -->   det(R) = -1.0000048875808716\n",
      "n= 123   -->   det(R) = 1.000006079673767\n",
      "n= 124   -->   det(R) = -1.0000052452087402\n",
      "n= 125   -->   det(R) = 1.0000048875808716\n",
      "n= 126   -->   det(R) = -1.000004529953003\n",
      "n= 127   -->   det(R) = 1.0000052452087402\n",
      "n= 128   -->   det(R) = -1.000004529953003\n",
      "n= 129   -->   det(R) = 1.0000066757202148\n",
      "n= 130   -->   det(R) = -1.0000052452087402\n",
      "n= 131   -->   det(R) = 1.0000050067901611\n",
      "n= 132   -->   det(R) = -1.000005841255188\n",
      "n= 133   -->   det(R) = 1.000006079673767\n",
      "n= 134   -->   det(R) = -1.0000051259994507\n",
      "n= 135   -->   det(R) = 1.0000056028366089\n",
      "n= 136   -->   det(R) = -1.0000054836273193\n",
      "n= 137   -->   det(R) = 1.0000066757202148\n",
      "n= 138   -->   det(R) = -1.0000065565109253\n",
      "n= 139   -->   det(R) = 1.0000077486038208\n",
      "n= 140   -->   det(R) = -1.0000075101852417\n",
      "n= 141   -->   det(R) = 1.0000054836273193\n",
      "n= 142   -->   det(R) = -1.000006079673767\n",
      "n= 143   -->   det(R) = 1.0000059604644775\n",
      "n= 144   -->   det(R) = -1.0000075101852417\n",
      "n= 145   -->   det(R) = 1.0000046491622925\n",
      "n= 146   -->   det(R) = -1.0000059604644775\n",
      "n= 147   -->   det(R) = 1.0000050067901611\n",
      "n= 148   -->   det(R) = -1.0000048875808716\n",
      "n= 149   -->   det(R) = 1.0000053644180298\n",
      "n= 150   -->   det(R) = -1.0000046491622925\n",
      "n= 151   -->   det(R) = 1.0000072717666626\n",
      "n= 152   -->   det(R) = -1.0000067949295044\n",
      "n= 153   -->   det(R) = 1.0000048875808716\n",
      "n= 154   -->   det(R) = -1.000006079673767\n",
      "n= 155   -->   det(R) = 1.000006079673767\n",
      "n= 156   -->   det(R) = -1.0000067949295044\n",
      "n= 157   -->   det(R) = 1.0000066757202148\n",
      "n= 158   -->   det(R) = -1.0000076293945312\n",
      "n= 159   -->   det(R) = 1.0000075101852417\n",
      "n= 160   -->   det(R) = -1.0000078678131104\n",
      "n= 161   -->   det(R) = 1.0000067949295044\n",
      "n= 162   -->   det(R) = -1.0000054836273193\n",
      "n= 163   -->   det(R) = 1.0000070333480835\n",
      "n= 164   -->   det(R) = -1.0000051259994507\n",
      "n= 165   -->   det(R) = 1.0000061988830566\n",
      "n= 166   -->   det(R) = -1.0000054836273193\n",
      "n= 167   -->   det(R) = 1.0000040531158447\n",
      "n= 168   -->   det(R) = -1.0000059604644775\n",
      "n= 169   -->   det(R) = 1.000006914138794\n",
      "n= 170   -->   det(R) = -1.000008225440979\n",
      "n= 171   -->   det(R) = 1.0000070333480835\n",
      "n= 172   -->   det(R) = -1.000007152557373\n",
      "n= 173   -->   det(R) = 1.0000079870224\n",
      "n= 174   -->   det(R) = -1.000009298324585\n",
      "n= 175   -->   det(R) = 1.0000088214874268\n",
      "n= 176   -->   det(R) = -1.0000079870224\n",
      "n= 177   -->   det(R) = 1.0000075101852417\n",
      "n= 178   -->   det(R) = -1.000009298324585\n",
      "n= 179   -->   det(R) = 1.0000098943710327\n",
      "n= 180   -->   det(R) = -1.0000076293945312\n",
      "n= 181   -->   det(R) = 1.0000059604644775\n",
      "n= 182   -->   det(R) = -1.0000076293945312\n",
      "n= 183   -->   det(R) = 1.000005841255188\n",
      "n= 184   -->   det(R) = -1.0000076293945312\n",
      "n= 185   -->   det(R) = 1.0000075101852417\n",
      "n= 186   -->   det(R) = -1.0000066757202148\n",
      "n= 187   -->   det(R) = 1.0000059604644775\n",
      "n= 188   -->   det(R) = -1.0000066757202148\n",
      "n= 189   -->   det(R) = 1.0000051259994507\n",
      "n= 190   -->   det(R) = -1.0000038146972656\n",
      "n= 191   -->   det(R) = 1.0000050067901611\n",
      "n= 192   -->   det(R) = -1.0000053644180298\n",
      "n= 193   -->   det(R) = 1.000005841255188\n",
      "n= 194   -->   det(R) = -1.000006914138794\n",
      "n= 195   -->   det(R) = 1.000004768371582\n",
      "n= 196   -->   det(R) = -1.0000065565109253\n",
      "n= 197   -->   det(R) = 1.0000064373016357\n",
      "n= 198   -->   det(R) = -1.0000051259994507\n",
      "n= 199   -->   det(R) = 1.0000041723251343\n",
      "n= 200   -->   det(R) = -1.0000057220458984\n",
      "n= 201   -->   det(R) = 1.0000052452087402\n",
      "n= 202   -->   det(R) = -1.0000030994415283\n",
      "n= 203   -->   det(R) = 1.0000035762786865\n",
      "n= 204   -->   det(R) = -1.0000042915344238\n",
      "n= 205   -->   det(R) = 1.0000027418136597\n",
      "n= 206   -->   det(R) = -1.000001311302185\n",
      "n= 207   -->   det(R) = 1.0000056028366089\n",
      "n= 208   -->   det(R) = -1.0000042915344238\n",
      "n= 209   -->   det(R) = 1.0000029802322388\n",
      "n= 210   -->   det(R) = -1.000003457069397\n",
      "n= 211   -->   det(R) = 1.0000019073486328\n",
      "n= 212   -->   det(R) = -1.0000039339065552\n",
      "n= 213   -->   det(R) = 1.000001072883606\n",
      "n= 214   -->   det(R) = -1.0000004768371582\n",
      "n= 215   -->   det(R) = 1.0000029802322388\n",
      "n= 216   -->   det(R) = -1.0000026226043701\n",
      "n= 217   -->   det(R) = 1.0000019073486328\n",
      "n= 218   -->   det(R) = -1.0000029802322388\n",
      "n= 219   -->   det(R) = 0.9999997615814209\n",
      "n= 220   -->   det(R) = -1.0000019073486328\n",
      "n= 221   -->   det(R) = 1.000001311302185\n",
      "n= 222   -->   det(R) = -0.9999996423721313\n",
      "n= 223   -->   det(R) = 1.0000008344650269\n",
      "n= 224   -->   det(R) = -1.0000005960464478\n",
      "n= 225   -->   det(R) = 1.0000026226043701\n",
      "n= 226   -->   det(R) = -1.0000028610229492\n",
      "n= 227   -->   det(R) = 1.000003457069397\n",
      "n= 228   -->   det(R) = -1.0000028610229492\n",
      "n= 229   -->   det(R) = 1.0000051259994507\n",
      "n= 230   -->   det(R) = -1.0000022649765015\n",
      "n= 231   -->   det(R) = 1.000003695487976\n",
      "n= 232   -->   det(R) = -1.0000038146972656\n",
      "n= 233   -->   det(R) = 1.0000039339065552\n",
      "n= 234   -->   det(R) = -1.0000017881393433\n",
      "n= 235   -->   det(R) = 1.0000028610229492\n",
      "n= 236   -->   det(R) = -1.0000014305114746\n",
      "n= 237   -->   det(R) = 1.0\n",
      "n= 238   -->   det(R) = -1.000001311302185\n",
      "n= 239   -->   det(R) = 1.0000017881393433\n",
      "n= 240   -->   det(R) = -0.9999993443489075\n",
      "n= 241   -->   det(R) = 0.9999985098838806\n",
      "n= 242   -->   det(R) = -1.0000015497207642\n",
      "n= 243   -->   det(R) = 1.000001072883606\n",
      "n= 244   -->   det(R) = -1.0000004768371582\n",
      "n= 245   -->   det(R) = 0.9999992847442627\n",
      "n= 246   -->   det(R) = -1.0000005960464478\n",
      "n= 247   -->   det(R) = 1.0000030994415283\n",
      "n= 248   -->   det(R) = -1.0000007152557373\n",
      "n= 249   -->   det(R) = 1.0000025033950806\n",
      "n= 250   -->   det(R) = -1.0000020265579224\n",
      "n= 251   -->   det(R) = 1.0000042915344238\n",
      "n= 252   -->   det(R) = -1.0000044107437134\n",
      "n= 253   -->   det(R) = 1.0000048875808716\n",
      "n= 254   -->   det(R) = -1.0000053644180298\n",
      "n= 255   -->   det(R) = 1.000003695487976\n",
      "n= 256   -->   det(R) = -1.0000056028366089\n",
      "n= 257   -->   det(R) = 1.0000052452087402\n",
      "n= 258   -->   det(R) = -1.0000056028366089\n",
      "n= 259   -->   det(R) = 1.0000035762786865\n",
      "n= 260   -->   det(R) = -1.000004529953003\n",
      "n= 261   -->   det(R) = 1.0000048875808716\n",
      "n= 262   -->   det(R) = -1.000004768371582\n",
      "n= 263   -->   det(R) = 1.0000057220458984\n",
      "n= 264   -->   det(R) = -1.000004768371582\n",
      "n= 265   -->   det(R) = 1.0000073909759521\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n= 266   -->   det(R) = -1.0000070333480835\n",
      "n= 267   -->   det(R) = 1.0000077486038208\n",
      "n= 268   -->   det(R) = -1.0000061988830566\n",
      "n= 269   -->   det(R) = 1.0000050067901611\n",
      "n= 270   -->   det(R) = -1.000005841255188\n",
      "n= 271   -->   det(R) = 1.000004768371582\n",
      "n= 272   -->   det(R) = -1.0000059604644775\n",
      "n= 273   -->   det(R) = 1.0000053644180298\n",
      "n= 274   -->   det(R) = -1.0000040531158447\n",
      "n= 275   -->   det(R) = 1.0000050067901611\n",
      "n= 276   -->   det(R) = -1.0000054836273193\n",
      "n= 277   -->   det(R) = 1.0000051259994507\n",
      "n= 278   -->   det(R) = -1.0000029802322388\n",
      "n= 279   -->   det(R) = 1.0000039339065552\n",
      "n= 280   -->   det(R) = -1.000003457069397\n",
      "n= 281   -->   det(R) = 1.0000041723251343\n",
      "n= 282   -->   det(R) = -1.0000050067901611\n",
      "n= 283   -->   det(R) = 1.0000038146972656\n",
      "n= 284   -->   det(R) = -1.0000019073486328\n",
      "n= 285   -->   det(R) = 1.0000061988830566\n",
      "n= 286   -->   det(R) = -1.000005841255188\n",
      "n= 287   -->   det(R) = 1.0000033378601074\n",
      "n= 288   -->   det(R) = -1.000005841255188\n",
      "n= 289   -->   det(R) = 1.0000050067901611\n",
      "n= 290   -->   det(R) = -1.000008463859558\n",
      "n= 291   -->   det(R) = 1.0000054836273193\n",
      "n= 292   -->   det(R) = -1.0000056028366089\n",
      "n= 293   -->   det(R) = 1.0000044107437134\n",
      "n= 294   -->   det(R) = -1.0000061988830566\n",
      "n= 295   -->   det(R) = 1.0000067949295044\n",
      "n= 296   -->   det(R) = -1.000007152557373\n",
      "n= 297   -->   det(R) = 1.000004529953003\n",
      "n= 298   -->   det(R) = -1.0000072717666626\n",
      "n= 299   -->   det(R) = 1.0000042915344238\n",
      "n= 300   -->   det(R) = -1.0000079870224\n",
      "n= 301   -->   det(R) = 1.000006079673767\n",
      "n= 302   -->   det(R) = -1.000008225440979\n",
      "n= 303   -->   det(R) = 1.000007152557373\n",
      "n= 304   -->   det(R) = -1.0000054836273193\n",
      "n= 305   -->   det(R) = 1.0000098943710327\n",
      "n= 306   -->   det(R) = -1.000008225440979\n",
      "n= 307   -->   det(R) = 1.0000075101852417\n",
      "n= 308   -->   det(R) = -1.0000094175338745\n",
      "n= 309   -->   det(R) = 1.0000097751617432\n",
      "n= 310   -->   det(R) = -1.0000070333480835\n",
      "n= 311   -->   det(R) = 1.0000081062316895\n",
      "n= 312   -->   det(R) = -1.0000087022781372\n",
      "n= 313   -->   det(R) = 1.000008463859558\n",
      "n= 314   -->   det(R) = -1.000006079673767\n",
      "n= 315   -->   det(R) = 1.0000085830688477\n",
      "n= 316   -->   det(R) = -1.0000087022781372\n",
      "n= 317   -->   det(R) = 1.0000077486038208\n",
      "n= 318   -->   det(R) = -1.0000070333480835\n",
      "n= 319   -->   det(R) = 1.0000039339065552\n",
      "n= 320   -->   det(R) = -1.000004768371582\n",
      "n= 321   -->   det(R) = 1.0000057220458984\n",
      "n= 322   -->   det(R) = -1.0000033378601074\n",
      "n= 323   -->   det(R) = 1.0000028610229492\n",
      "n= 324   -->   det(R) = -1.0000040531158447\n",
      "n= 325   -->   det(R) = 1.0000017881393433\n",
      "n= 326   -->   det(R) = -1.0000022649765015\n",
      "n= 327   -->   det(R) = 1.0000001192092896\n",
      "n= 328   -->   det(R) = -1.000000238418579\n",
      "n= 329   -->   det(R) = 0.9999995827674866\n",
      "n= 330   -->   det(R) = -0.9999980926513672\n",
      "n= 331   -->   det(R) = 1.0000019073486328\n",
      "n= 332   -->   det(R) = -0.9999997615814209\n",
      "n= 333   -->   det(R) = 0.9999990463256836\n",
      "n= 334   -->   det(R) = -1.0000011920928955\n",
      "n= 335   -->   det(R) = 0.9999954700469971\n",
      "n= 336   -->   det(R) = -0.9999940991401672\n",
      "n= 337   -->   det(R) = 0.9999994039535522\n",
      "n= 338   -->   det(R) = -0.9999977946281433\n",
      "n= 339   -->   det(R) = 0.9999980926513672\n",
      "n= 340   -->   det(R) = -0.9999969005584717\n",
      "n= 341   -->   det(R) = 0.9999971985816956\n",
      "n= 342   -->   det(R) = -0.9999997019767761\n",
      "n= 343   -->   det(R) = 0.9999974966049194\n",
      "n= 344   -->   det(R) = -0.9999961256980896\n",
      "n= 345   -->   det(R) = 0.9999966621398926\n",
      "n= 346   -->   det(R) = -0.9999969601631165\n",
      "n= 347   -->   det(R) = 0.9999967813491821\n",
      "n= 348   -->   det(R) = -0.9999969601631165\n",
      "n= 349   -->   det(R) = 0.9999993443489075\n",
      "n= 350   -->   det(R) = -0.999997615814209\n",
      "n= 351   -->   det(R) = 0.9999971389770508\n",
      "n= 352   -->   det(R) = -0.9999961853027344\n",
      "n= 353   -->   det(R) = 0.9999968409538269\n",
      "n= 354   -->   det(R) = -0.9999998211860657\n",
      "n= 355   -->   det(R) = 0.9999989867210388\n",
      "n= 356   -->   det(R) = -1.000000238418579\n",
      "n= 357   -->   det(R) = 0.9999975562095642\n",
      "n= 358   -->   det(R) = -1.0000004768371582\n",
      "n= 359   -->   det(R) = 0.9999974370002747\n",
      "n= 360   -->   det(R) = -0.9999984502792358\n",
      "n= 361   -->   det(R) = 0.9999979138374329\n",
      "n= 362   -->   det(R) = -0.9999992847442627\n",
      "n= 363   -->   det(R) = 0.9999974966049194\n",
      "n= 364   -->   det(R) = -0.999997615814209\n",
      "n= 365   -->   det(R) = 0.9999976754188538\n",
      "n= 366   -->   det(R) = -0.999999463558197\n",
      "n= 367   -->   det(R) = 0.9999977350234985\n",
      "n= 368   -->   det(R) = -1.0000003576278687\n",
      "n= 369   -->   det(R) = 0.9999972581863403\n",
      "n= 370   -->   det(R) = -0.9999984502792358\n",
      "n= 371   -->   det(R) = 0.9999949932098389\n",
      "n= 372   -->   det(R) = -0.9999948740005493\n",
      "n= 373   -->   det(R) = 0.9999961853027344\n",
      "n= 374   -->   det(R) = -0.9999966025352478\n",
      "n= 375   -->   det(R) = 0.9999985098838806\n",
      "n= 376   -->   det(R) = -0.9999982118606567\n",
      "n= 377   -->   det(R) = 0.9999970197677612\n",
      "n= 378   -->   det(R) = -0.999997615814209\n",
      "n= 379   -->   det(R) = 0.9999983906745911\n",
      "n= 380   -->   det(R) = -0.9999972581863403\n",
      "n= 381   -->   det(R) = 0.9999969601631165\n",
      "n= 382   -->   det(R) = -0.9999971389770508\n",
      "n= 383   -->   det(R) = 0.9999986886978149\n",
      "n= 384   -->   det(R) = -0.9999917149543762\n",
      "n= 385   -->   det(R) = 0.9999921917915344\n",
      "n= 386   -->   det(R) = -0.9999923706054688\n",
      "n= 387   -->   det(R) = 0.9999908804893494\n",
      "n= 388   -->   det(R) = -0.9999908804893494\n",
      "n= 389   -->   det(R) = 0.999989926815033\n",
      "n= 390   -->   det(R) = -0.9999897480010986\n",
      "n= 391   -->   det(R) = 0.99998939037323\n",
      "n= 392   -->   det(R) = -0.9999868869781494\n",
      "n= 393   -->   det(R) = 0.9999902844429016\n",
      "n= 394   -->   det(R) = -0.9999869465827942\n",
      "n= 395   -->   det(R) = 0.9999935626983643\n",
      "n= 396   -->   det(R) = -0.9999907612800598\n",
      "n= 397   -->   det(R) = 0.9999919533729553\n",
      "n= 398   -->   det(R) = -0.9999911785125732\n",
      "n= 399   -->   det(R) = 0.999990701675415\n",
      "n= 400   -->   det(R) = -0.9999914169311523\n",
      "n= 401   -->   det(R) = 0.9999921321868896\n",
      "n= 402   -->   det(R) = -0.9999939799308777\n",
      "n= 403   -->   det(R) = 0.9999924898147583\n",
      "n= 404   -->   det(R) = -0.9999921917915344\n",
      "n= 405   -->   det(R) = 0.9999913573265076\n",
      "n= 406   -->   det(R) = -0.9999929070472717\n",
      "n= 407   -->   det(R) = 0.9999916553497314\n",
      "n= 408   -->   det(R) = -0.9999943971633911\n",
      "n= 409   -->   det(R) = 0.9999927282333374\n",
      "n= 410   -->   det(R) = -0.9999926090240479\n",
      "n= 411   -->   det(R) = 0.9999936819076538\n",
      "n= 412   -->   det(R) = -0.9999929070472717\n",
      "n= 413   -->   det(R) = 0.9999933838844299\n",
      "n= 414   -->   det(R) = -0.9999936819076538\n",
      "n= 415   -->   det(R) = 0.9999932646751404\n",
      "n= 416   -->   det(R) = -0.9999911785125732\n",
      "n= 417   -->   det(R) = 0.9999940395355225\n",
      "n= 418   -->   det(R) = -0.999992311000824\n",
      "n= 419   -->   det(R) = 0.9999896883964539\n",
      "n= 420   -->   det(R) = -0.9999971985816956\n",
      "n= 421   -->   det(R) = 0.9999925494194031\n",
      "n= 422   -->   det(R) = -0.999993085861206\n",
      "n= 423   -->   det(R) = 0.9999914169311523\n",
      "n= 424   -->   det(R) = -0.9999920725822449\n",
      "n= 425   -->   det(R) = 0.9999921917915344\n",
      "n= 426   -->   det(R) = -0.9999964833259583\n",
      "n= 427   -->   det(R) = 0.9999917149543762\n",
      "n= 428   -->   det(R) = -0.9999957084655762\n",
      "n= 429   -->   det(R) = 0.9999958872795105\n",
      "n= 430   -->   det(R) = -0.9999922513961792\n",
      "n= 431   -->   det(R) = 0.9999933838844299\n",
      "n= 432   -->   det(R) = -0.9999940395355225\n",
      "n= 433   -->   det(R) = 0.999994695186615\n",
      "n= 434   -->   det(R) = -0.9999916553497314\n",
      "n= 435   -->   det(R) = 0.9999903440475464\n",
      "n= 436   -->   det(R) = -0.9999921917915344\n",
      "n= 437   -->   det(R) = 0.9999923706054688\n",
      "n= 438   -->   det(R) = -0.9999896883964539\n",
      "n= 439   -->   det(R) = 0.9999939203262329\n",
      "n= 440   -->   det(R) = -0.9999906420707703\n",
      "n= 441   -->   det(R) = 0.9999946355819702\n",
      "n= 442   -->   det(R) = -0.9999898076057434\n",
      "n= 443   -->   det(R) = 0.9999927282333374\n",
      "n= 444   -->   det(R) = -0.9999874830245972\n",
      "n= 445   -->   det(R) = 0.9999921917915344\n",
      "n= 446   -->   det(R) = -0.9999923706054688\n",
      "n= 447   -->   det(R) = 0.9999938607215881\n",
      "n= 448   -->   det(R) = -0.999992847442627\n",
      "n= 449   -->   det(R) = 0.9999942183494568\n",
      "n= 450   -->   det(R) = -0.9999950528144836\n",
      "n= 451   -->   det(R) = 0.9999905824661255\n",
      "n= 452   -->   det(R) = -0.9999902844429016\n",
      "n= 453   -->   det(R) = 0.9999902844429016\n",
      "n= 454   -->   det(R) = -0.9999856352806091\n",
      "n= 455   -->   det(R) = 0.9999921321868896\n",
      "n= 456   -->   det(R) = -0.9999925494194031\n",
      "n= 457   -->   det(R) = 0.9999911189079285\n",
      "n= 458   -->   det(R) = -0.9999937415122986\n",
      "n= 459   -->   det(R) = 0.9999909400939941\n",
      "n= 460   -->   det(R) = -0.999991238117218\n",
      "n= 461   -->   det(R) = 0.9999911785125732\n",
      "n= 462   -->   det(R) = -0.9999892711639404\n",
      "n= 463   -->   det(R) = 0.999991238117218\n",
      "n= 464   -->   det(R) = -0.9999918937683105\n",
      "n= 465   -->   det(R) = 0.9999937415122986\n",
      "n= 466   -->   det(R) = -0.9999897480010986\n",
      "n= 467   -->   det(R) = 0.9999936819076538\n",
      "n= 468   -->   det(R) = -0.9999920129776001\n",
      "n= 469   -->   det(R) = 0.9999904632568359\n",
      "n= 470   -->   det(R) = -0.9999914169311523\n",
      "n= 471   -->   det(R) = 0.9999936819076538\n",
      "n= 472   -->   det(R) = -0.9999909400939941\n",
      "n= 473   -->   det(R) = 0.9999916553497314\n",
      "n= 474   -->   det(R) = -0.9999929666519165\n",
      "n= 475   -->   det(R) = 0.9999896883964539\n",
      "n= 476   -->   det(R) = -0.9999910593032837\n",
      "n= 477   -->   det(R) = 0.9999873042106628\n",
      "n= 478   -->   det(R) = -0.9999910593032837\n",
      "n= 479   -->   det(R) = 0.9999939203262329\n",
      "n= 480   -->   det(R) = -0.9999892115592957\n",
      "n= 481   -->   det(R) = 0.9999903440475464\n",
      "n= 482   -->   det(R) = -0.9999900460243225\n",
      "n= 483   -->   det(R) = 0.9999853372573853\n",
      "n= 484   -->   det(R) = -0.9999890327453613\n",
      "n= 485   -->   det(R) = 0.9999891519546509\n",
      "n= 486   -->   det(R) = -0.9999892115592957\n",
      "n= 487   -->   det(R) = 0.9999901652336121\n",
      "n= 488   -->   det(R) = -0.9999902844429016\n",
      "n= 489   -->   det(R) = 0.9999908804893494\n",
      "n= 490   -->   det(R) = -0.9999907612800598\n",
      "n= 491   -->   det(R) = 0.9999880194664001\n",
      "n= 492   -->   det(R) = -0.999986469745636\n",
      "n= 493   -->   det(R) = 0.9999849200248718\n",
      "n= 494   -->   det(R) = -0.9999871253967285\n",
      "n= 495   -->   det(R) = 0.9999852180480957\n",
      "n= 496   -->   det(R) = -0.9999859929084778\n",
      "n= 497   -->   det(R) = 0.9999881386756897\n",
      "n= 498   -->   det(R) = -0.9999834895133972\n",
      "n= 499   -->   det(R) = 0.9999828338623047\n",
      "n= 500   -->   det(R) = -0.9999837875366211\n",
      "det(R) = 0.999986\n",
      "diagonal mass = 0.1711707870070035\n",
      "\n",
      "H = tensor([[ 1.9610e+01,  1.0019e-01,  3.3320e-01,  ...,  6.1345e-02,\n",
      "          2.8224e-01,  2.7408e-01],\n",
      "        [ 1.0019e-01,  1.9610e+01, -3.2071e-01,  ..., -1.6489e-01,\n",
      "         -8.1962e-02, -2.6172e-01],\n",
      "        [ 3.3320e-01, -3.2071e-01,  2.0299e+01,  ...,  8.2332e-02,\n",
      "          5.0444e-01, -4.0055e-01],\n",
      "        ...,\n",
      "        [ 6.1345e-02, -1.6489e-01,  8.2332e-02,  ...,  2.0343e+01,\n",
      "          3.1601e-01, -2.0938e-02],\n",
      "        [ 2.8224e-01, -8.1962e-02,  5.0444e-01,  ...,  3.1601e-01,\n",
      "          2.0085e+01, -1.1488e-02],\n",
      "        [ 2.7408e-01, -2.6172e-01, -4.0055e-01,  ..., -2.0938e-02,\n",
      "         -1.1488e-02,  1.9924e+01]])\n",
      "\n",
      "theta_star = tensor([[-3.1398, -2.6375, -2.1653,  0.4994, -3.9554, -2.9655,  1.8267, -1.3101,\n",
      "         -1.5917, -3.3091,  1.6212,  0.2825, -1.5461, -2.4495,  0.8507,  1.0884,\n",
      "          1.7754,  1.1887, -0.6102, -3.0964,  2.5464, -0.0343, -2.6583,  3.4496,\n",
      "          2.2302, -3.1437, -1.9977, -1.3612, -2.3091,  1.8679, -2.8536,  3.7175,\n",
      "         -1.6533,  2.3611,  0.1362, -1.7592,  2.6711, -3.0521, -2.1163,  0.4794,\n",
      "          3.1731, -1.7138, -2.4357, -2.5537, -1.7635, -1.3817, -0.9317, -2.2755,\n",
      "          1.2502,  0.0325, -2.6135, -2.2843,  0.8470, -0.0571,  2.8310, -0.6064,\n",
      "         -3.2404, -2.9584, -1.1741, -0.8859,  0.4565, -0.8971,  1.4759, -1.3303,\n",
      "          2.9358,  0.9187, -1.2297,  3.5648,  1.0212, -2.7184, -2.2262,  2.5081,\n",
      "          1.8269,  3.1232, -0.3073,  2.7977,  1.9887,  1.2370, -0.9258,  3.8560,\n",
      "          0.8095, -1.0321, -0.0569,  3.9322,  2.6866, -0.2964,  3.9215,  1.7565,\n",
      "         -2.1297, -3.6403,  2.3246,  3.7513, -2.3305,  1.6429,  0.1703, -0.8553,\n",
      "         -1.0876,  1.1128,  0.8818,  2.7016,  1.4643,  1.8202,  3.5286,  1.2455,\n",
      "          0.5938, -1.4563,  2.9336,  0.5907,  2.5783,  3.8626, -0.8946,  2.8164,\n",
      "         -0.8123,  3.6097,  3.1484, -1.4337,  0.1435, -1.7468, -1.6178, -0.8099,\n",
      "         -0.0273, -1.3944, -3.7760, -2.4193, -0.3418, -1.2769,  2.9710,  3.2514,\n",
      "          2.5483,  1.7703, -3.1711,  3.7791, -3.5248, -1.3150, -2.8153,  1.4384,\n",
      "         -3.3285, -1.9720, -2.5408, -2.4587, -1.8673,  3.9321, -0.3267,  1.2193,\n",
      "         -3.9707,  3.5565, -0.8710, -3.6710,  2.7566, -1.0816,  3.6325, -2.7169,\n",
      "         -3.7137, -3.0050,  1.7327, -0.4486, -3.7057,  0.7417, -0.2550,  1.4451,\n",
      "         -2.0347, -2.8556,  2.7263, -1.9248,  2.8137,  3.2432, -2.7973, -1.8442,\n",
      "          0.4815, -3.7715,  1.2284, -1.6666, -1.7735, -3.0923,  1.8713, -2.5490,\n",
      "         -3.1972, -1.0519, -2.2268, -3.8888,  1.6121, -1.5219,  2.8019,  2.8157,\n",
      "         -2.5511, -2.3319, -1.4198,  2.3430, -0.1377, -1.4290,  2.4779,  3.7934,\n",
      "          2.9572, -3.0588, -0.8308, -0.7672,  3.4136, -2.0688, -2.2925,  0.0626,\n",
      "         -0.9292,  1.5141,  0.4862, -2.3882,  2.9086,  2.4899,  0.8759, -3.6205,\n",
      "          1.8797,  2.6579,  1.1136, -1.5462,  0.2683, -1.5366,  3.7658,  3.8625,\n",
      "         -0.4661, -2.6912,  2.3530,  2.0415,  2.1203, -3.0098,  1.3563, -1.7070,\n",
      "         -3.5158, -2.7931,  1.6956,  1.4975, -3.5107,  2.2683,  3.0650,  3.0365,\n",
      "          2.2586, -0.6279,  2.6803,  3.1315,  2.0851, -2.8770, -1.3960,  3.1689,\n",
      "          3.0495,  2.5523, -1.6718, -0.7922, -2.9800, -2.2796,  3.0705, -3.2831,\n",
      "         -0.9885,  0.8491, -2.4000,  0.9324, -0.6430,  1.5997, -3.0695,  0.5520,\n",
      "         -3.6469,  2.4816,  3.8855, -1.4277,  0.5915, -2.0608, -2.5587, -2.0258,\n",
      "         -1.9056,  0.7593, -0.4585,  0.2805, -3.0653, -2.5130, -3.4629, -2.8750,\n",
      "          3.3497,  1.4861, -3.8148, -0.6676,  0.3210,  2.1369,  3.7098,  0.9659,\n",
      "          2.8177, -1.4234, -0.1307, -2.4147,  0.9215,  3.6922,  2.5119,  3.9803,\n",
      "         -1.8024, -0.5005,  0.8251,  3.2159, -3.6770, -1.9644,  0.5802, -2.3120,\n",
      "          1.4942, -0.2727, -1.0365,  2.1452,  2.8587,  3.8908,  1.8114, -0.1094,\n",
      "          3.2704,  3.1834, -2.0047,  1.8220,  0.4687, -1.7287, -0.9526, -0.9445,\n",
      "         -2.7991, -1.2206,  1.3460,  2.9365,  0.3038, -3.8736,  2.1185, -1.2103,\n",
      "          3.5722, -3.8651, -0.9359,  3.1021,  1.7304, -1.9956, -3.4636, -0.0430,\n",
      "          1.5452, -3.3208, -3.3472, -0.0504, -0.8204,  2.5710, -3.8757, -0.6362,\n",
      "         -3.0997, -0.5826, -2.0437,  1.2589, -3.3462, -3.1466, -2.2700, -3.5033,\n",
      "          2.5251, -0.5724, -2.2223,  2.8029, -0.9075,  2.0688, -1.2400, -3.3466,\n",
      "          0.8785,  2.4908, -3.9001,  0.4164,  0.7972,  0.4591, -0.0990, -1.2434,\n",
      "         -3.1053,  0.6524, -2.6865, -3.3050, -1.2842, -2.7382,  1.2260,  2.8492,\n",
      "          3.1087, -2.4793,  2.1808,  2.8425,  0.0449,  1.6876,  2.2634,  3.0606,\n",
      "          2.1403,  1.7074, -1.5182, -2.2302, -1.8967,  3.2911, -0.9688,  0.1431,\n",
      "         -3.7303, -0.1777, -1.1284, -2.5810,  3.0979, -3.2384, -0.5718, -0.2836,\n",
      "         -3.6212,  2.4185, -1.2728,  1.7970,  2.2325,  3.5272,  0.9894,  3.0029,\n",
      "          3.6942,  0.7928, -0.8150, -1.0952,  0.6480,  1.4395, -3.7735,  2.9970,\n",
      "          0.6308, -3.7261,  1.2812,  2.5385,  1.4946,  3.2651,  0.0827, -3.3184,\n",
      "         -0.0091,  2.9074, -1.9239,  1.7061,  0.9221, -0.6490,  0.0284,  1.7018,\n",
      "         -2.7372,  2.5255,  2.7080,  2.2446,  3.9971, -0.1747, -2.8246,  0.1826,\n",
      "         -1.1605,  1.4120,  3.3836, -2.1893,  0.1675,  3.8905, -3.1932, -0.6903,\n",
      "          3.8842,  2.7949,  1.1610, -1.7252, -0.3729, -3.5869, -3.7659, -3.7477,\n",
      "          3.8419,  3.1637,  1.5867, -1.0047,  3.4440, -1.0566,  2.7769, -0.1302,\n",
      "         -1.8816, -1.1164, -0.8541, -3.6613,  1.1962, -1.2187,  1.8377,  2.5503,\n",
      "         -0.6360,  1.9399,  0.7992,  2.6863, -2.5796, -0.3512, -1.3329,  3.5049,\n",
      "         -3.5904, -2.2483,  0.4516,  3.5509,  2.7064, -3.7430, -2.8123,  3.8784,\n",
      "          0.5829, -3.4260, -1.2602,  1.7487, -0.8364, -3.0725, -2.4697, -2.0721,\n",
      "         -0.1567,  1.5676,  1.9205, -1.9432, -0.6711, -3.0883,  3.0250,  3.9918,\n",
      "          3.8879,  1.6347, -0.8529, -0.0997]])\n",
      "\n",
      "eig_val = tensor([10.5016, 10.5067, 10.5411, 10.5444, 10.5499, 10.5504, 10.5707, 10.5929,\n",
      "        10.6362, 10.6923, 10.6949, 10.7344, 10.7600, 10.8420, 10.9571, 10.9711,\n",
      "        11.0311, 11.0719, 11.0855, 11.1388, 11.2676, 11.3598, 11.4615, 11.5133,\n",
      "        11.5446, 11.5507, 11.6764, 11.6861, 11.7595, 11.7653, 11.8188, 11.8275,\n",
      "        11.8290, 11.8772, 11.9107, 11.9341, 11.9481, 11.9880, 12.0023, 12.0081,\n",
      "        12.0331, 12.0557, 12.0999, 12.2279, 12.2492, 12.2597, 12.2779, 12.2938,\n",
      "        12.3175, 12.3207, 12.3220, 12.3338, 12.4441, 12.4619, 12.5809, 12.5860,\n",
      "        12.5865, 12.6150, 12.7168, 12.7308, 12.7655, 12.9129, 12.9864, 13.0032,\n",
      "        13.1277, 13.2249, 13.2512, 13.2574, 13.3166, 13.3259, 13.3647, 13.3676,\n",
      "        13.3690, 13.3912, 13.3933, 13.4635, 13.4812, 13.5094, 13.5285, 13.5367,\n",
      "        13.7087, 13.8186, 13.8769, 13.8900, 13.9580, 13.9821, 13.9848, 13.9860,\n",
      "        14.0269, 14.0322, 14.0813, 14.1057, 14.1298, 14.1365, 14.1468, 14.1852,\n",
      "        14.2162, 14.2218, 14.2345, 14.3488, 14.3638, 14.4543, 14.5061, 14.5212,\n",
      "        14.5780, 14.5852, 14.6041, 14.6830, 14.6928, 14.7177, 14.7644, 14.7835,\n",
      "        14.7960, 14.8047, 14.8161, 14.8325, 14.9709, 14.9935, 14.9954, 15.0029,\n",
      "        15.0324, 15.0403, 15.0451, 15.0916, 15.2328, 15.2916, 15.2921, 15.2993,\n",
      "        15.4676, 15.5239, 15.5316, 15.6500, 15.6574, 15.6742, 15.7030, 15.7569,\n",
      "        15.7627, 15.7957, 15.8400, 15.9240, 15.9798, 16.0339, 16.0916, 16.1196,\n",
      "        16.1244, 16.1504, 16.1844, 16.2217, 16.2437, 16.2982, 16.3292, 16.3859,\n",
      "        16.4684, 16.4736, 16.5000, 16.5009, 16.5560, 16.5705, 16.7972, 16.8208,\n",
      "        16.8791, 16.8985, 16.9757, 16.9866, 16.9877, 17.0616, 17.0632, 17.0972,\n",
      "        17.1193, 17.2119, 17.2296, 17.2851, 17.3129, 17.3450, 17.3952, 17.4423,\n",
      "        17.4532, 17.4691, 17.4905, 17.4979, 17.5216, 17.5504, 17.5700, 17.5789,\n",
      "        17.5973, 17.6443, 17.7193, 17.7668, 17.7681, 17.7708, 17.7890, 17.7958,\n",
      "        17.8314, 17.9230, 17.9285, 17.9613, 17.9913, 17.9984, 18.0167, 18.0654,\n",
      "        18.0995, 18.1910, 18.2184, 18.2476, 18.3124, 18.3770, 18.4572, 18.4728,\n",
      "        18.5719, 18.5816, 18.8256, 18.8282, 18.8394, 18.8763, 18.9129, 18.9494,\n",
      "        19.0138, 19.0573, 19.0582, 19.0992, 19.1261, 19.1514, 19.2243, 19.2371,\n",
      "        19.2495, 19.3379, 19.3691, 19.4277, 19.4334, 19.4442, 19.4446, 19.4978,\n",
      "        19.5257, 19.5370, 19.5380, 19.5622, 19.5686, 19.6139, 19.6277, 19.6704,\n",
      "        19.6825, 19.7092, 19.7553, 19.7818, 19.8275, 19.8353, 19.8484, 19.8815,\n",
      "        19.8959, 19.9053, 19.9179, 19.9791, 19.9871, 20.0144, 20.0289, 20.0337,\n",
      "        20.0426, 20.0625, 20.0824, 20.0936, 20.1016, 20.1233, 20.1241, 20.1433,\n",
      "        20.2062, 20.2079, 20.3259, 20.3487, 20.3870, 20.4248, 20.4922, 20.5147,\n",
      "        20.5496, 20.5575, 20.5616, 20.5638, 20.5897, 20.6298, 20.6423, 20.6427,\n",
      "        20.6457, 20.6583, 20.6784, 20.7433, 20.9400, 20.9415, 20.9477, 21.0054,\n",
      "        21.0426, 21.0701, 21.1771, 21.2117, 21.2686, 21.2992, 21.3047, 21.3462,\n",
      "        21.3471, 21.3713, 21.4339, 21.4497, 21.5203, 21.5309, 21.5515, 21.5635,\n",
      "        21.5723, 21.5749, 21.6093, 21.6174, 21.6252, 21.6292, 21.6307, 21.6488,\n",
      "        21.6930, 21.7244, 21.8371, 21.8577, 21.8943, 21.9813, 22.0506, 22.0593,\n",
      "        22.1521, 22.1837, 22.1956, 22.1989, 22.2588, 22.3115, 22.3971, 22.5730,\n",
      "        22.5905, 22.6830, 22.7259, 22.7300, 22.7682, 22.7804, 22.9827, 22.9989,\n",
      "        23.0266, 23.1053, 23.1297, 23.2310, 23.2662, 23.3611, 23.3735, 23.4275,\n",
      "        23.5794, 23.5906, 23.6025, 23.6555, 23.6856, 23.7475, 23.7564, 23.7624,\n",
      "        23.7719, 23.7888, 23.9039, 23.9072, 23.9234, 23.9758, 23.9967, 24.0040,\n",
      "        24.1093, 24.1943, 24.2301, 24.2876, 24.3388, 24.4680, 24.5333, 24.5774,\n",
      "        24.6131, 24.6386, 24.6664, 24.6908, 24.7043, 24.7360, 24.7669, 24.7745,\n",
      "        24.8545, 24.8940, 24.8963, 24.9299, 24.9341, 24.9434, 25.0420, 25.1451,\n",
      "        25.1481, 25.2144, 25.2312, 25.2413, 25.3648, 25.3817, 25.3935, 25.4082,\n",
      "        25.4628, 25.4727, 25.5619, 25.5948, 25.6081, 25.6410, 25.7004, 25.7176,\n",
      "        25.7209, 25.9073, 25.9414, 25.9692, 25.9957, 26.0180, 26.0471, 26.0942,\n",
      "        26.1009, 26.1352, 26.2611, 26.2718, 26.2737, 26.2902, 26.3127, 26.3318,\n",
      "        26.3756, 26.4084, 26.4104, 26.4261, 26.5221, 26.5270, 26.5281, 26.5294,\n",
      "        26.5347, 26.5415, 26.5667, 26.6195, 26.6281, 26.6925, 26.7108, 26.8123,\n",
      "        26.9238, 26.9272, 26.9567, 26.9592, 26.9758, 26.9938, 26.9940, 27.1620,\n",
      "        27.1758, 27.1814, 27.2451, 27.2705, 27.2891, 27.3164, 27.3987, 27.4269,\n",
      "        27.4543, 27.5037, 27.5893, 27.6397, 27.6636, 27.7026, 27.7044, 27.7506,\n",
      "        27.7729, 27.7944, 27.8411, 27.9116, 27.9309, 27.9813, 28.0614, 28.1624,\n",
      "        28.1827, 28.2105, 28.2467, 28.2475, 28.3229, 28.4306, 28.5024, 28.5433,\n",
      "        28.5616, 28.6369, 28.6590, 28.6598, 28.6723, 28.6755, 28.6770, 28.7937,\n",
      "        28.8019, 28.8661, 28.8733, 28.8966, 28.9082, 28.9373, 28.9524, 29.0463,\n",
      "        29.0806, 29.1035, 29.1098, 29.1352, 29.1593, 29.1812, 29.2163, 29.2218,\n",
      "        29.2232, 29.3995, 29.4223, 29.4803])\n",
      "\n",
      "eig_vec = tensor([[-5.2277e-02, -5.1217e-02,  8.9267e-03,  ..., -4.2575e-02,\n",
      "         -7.5545e-05,  5.2252e-02],\n",
      "        [-2.2155e-02, -8.1414e-02, -1.3493e-02,  ...,  2.2144e-02,\n",
      "         -4.7297e-02,  8.6850e-02],\n",
      "        [ 7.7551e-03,  2.1336e-02,  5.2185e-02,  ...,  3.1496e-02,\n",
      "          2.3640e-04, -4.9754e-03],\n",
      "        ...,\n",
      "        [-1.1293e-03, -8.1236e-03,  3.7628e-02,  ..., -5.1098e-02,\n",
      "          5.6597e-03,  2.9113e-02],\n",
      "        [ 3.8749e-03, -2.9674e-02,  2.5281e-02,  ..., -2.5235e-02,\n",
      "         -3.5076e-02,  1.7765e-02],\n",
      "        [ 8.2876e-02,  3.6667e-02,  6.0253e-03,  ...,  2.9741e-02,\n",
      "         -2.9983e-04,  8.0061e-03]])\n",
      "\n",
      "orthogonality of H_inv(BC) = tensor([[ 1.0000, -0.0047, -0.0518,  ...,  0.0185, -0.0362, -0.0531],\n",
      "        [-0.0047,  1.0000,  0.0468,  ...,  0.0045,  0.0095,  0.0328],\n",
      "        [-0.0518,  0.0468,  1.0000,  ..., -0.0048, -0.0392,  0.0413],\n",
      "        ...,\n",
      "        [ 0.0185,  0.0045, -0.0048,  ...,  1.0000, -0.0222, -0.0015],\n",
      "        [-0.0362,  0.0095, -0.0392,  ..., -0.0222,  1.0000,  0.0112],\n",
      "        [-0.0531,  0.0328,  0.0413,  ..., -0.0015,  0.0112,  1.0000]])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAARDUlEQVR4nO3d0XXbxpoH8G/2pADZaSBH7sDJrWDlp7zaNxXE7sBOKriRO5BvBYn8mifrVrCxO7A2DcRRB7MPGNi0V6JACgQ+gr/fOTy0RZAYAiT/mMFgptRaAwCy+a+5CwAA1xFQAKQkoABI6au5CzCGUooTaQB7rtZaVv+vBgVASgIKgJQEFAApLeIc1Jdc2wWQXyll7eNqUACkJKAASElAAZCSgAIgJQEFQEoCCoCUBBQAKQkoAFJa5IW6AFP65qffP/77z1++n7Eky6IGBUBKAgqAlAQUACkJKABSElAApLRVL75SyvOIiFrryy2e+zAinkXE/fanDxFxXmu92KYsACzTxgHVwuk0IrYJp7OI+C4ifqy1vmt/O46Is1LKi4h4Umu92vR1AVieQQHVQuQkIl5ExPE2KyqlvGnP/XY1hGqtlxHxqD3+NiIebPP6ACzL2nNQpZTnpZQaXXA8iS6gXm+6klLK0+gCbl0N6UlEHLdaFgAH7rZOEq9qraXWeq/W+qjWunE4NacRcdk3612nBddFRDxtNTYADtjagBrjfFAp5XFEHMWwmtd5u3921/UCsN+m6Gbeh837ActetvvHOyoLAHtiioD6rt1frl3q82WOSylHOyoPAHtgpwHVziX1QXNrQLUefb3vblwQgMXbdQ1qtbPDhzs8F4ADs+uAuksznSY+gAOWcSy+vufg17OWAoBZ7Tqg+vH2tumyrgYFcMB2PeX7XULm/u2LfBylgh1anc46YvlTWh/a+4XbzPWdyNjEt5Fa66u5ywDA+CYLqC2ua9q01x8AC7LrgLrLUEmm3QA4YLsOqG1qQX1N668xCwLAfpmyBrXphbdqUAAHbNcB9cfKv2/tlffFNBt/3LggAIu304Bq1z71NaEhNajVjhRDBpcFYKGm6MX3W7sf0ouvD7F3Y8xFBcD+miKg+kkIHw1Y9od2/+uOygLAnth5QNVaL6JrrjsZcC3U44i4qrW+3HW5AMhtm4A6+uJ+iH5W3Z9vWmBlyKIftygTAAszOKBKKUellMcRcdL+9M9SypBaUV+LehERz0spJ18+3nrvnUXEq1rr66FlAmC51g4W2wLp/IaHjyLiTVuu/9u3tdZ31y1ca31ZSnkXEWellNftuR+iC7yfI+KZcfUA6K0NqFabKeuW2USrST1otaiH7c+XtdZ7Y60DgGXY9XQb12pBdTHHugHYD3s/3QYAyySgAEhJQAGQkoACIKVZOklANt/89PvcRWAL6/bbn798P2FJNrda9uxlnYsaFAApCSgAUhJQAKQkoABISUABkJKAAiAlAQVASgIKgJQEFAApCSgAUhJQAKQkoABISUABkJKAAiAlAQVASgIKgJQEFAApCSgAUjLl+4ExzfTd7PP2y1D2L6do37dtuKlDe79jU4MCICUBBUBKAgqAlAQUACkJKABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlAQUACkJKABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlL6auwD76Juffv/s/3/+8v1OX3/IelafM3Z5srtpe0V8vi12vd/GNuU+Hbquqcq0b/tql4Z+vpdIDQqAlAQUACkJKABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlAQUACkJKABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlAQUACmZ8n2gddMubzMNdsYp2u9apm2nps64LeaybhvOIVt5dmHKz99N23PKKe7HeL9TbTM1KABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlAQUACkJKABSElAApCSgAEhJQAGQkoACICUBBUBKAgqAlAQUACkJKABSElAApGTK9zWyTXc95bTQQ22zjYY+Z9fb/66vv8n+uOsU2evKuvp6+zZ1ONfb5jsyxj7Itk/VoABISUABkJKAAiAlAQVASgIKgJQEFAApCSgAUhJQAKQkoABISUABkJKAAiAlAQVASgIKgJQEFAApCSgAUhJQAKQkoABISUABkJKAAiClr+YuwNJ889PvH//95y/fb/ycscuw7XJzlWlsc613nW0+I4dg7M/jGNv5pvXab9NQgwIgJQEFQEoCCoCUBBQAKQkoAFISUACkJKAASElAAZCSgAIgJQEFQEoCCoCUBBQAKQkoAFISUACkJKAASElAAZCSgAIgJQEFQEqmfF+xb9OcZ5zO/K6W+J7WWer73df3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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "dim = 500\n",
    "num_epochs = 1000\n",
    "lrate = 0.01\n",
    "\n",
    "mu = 20\n",
    "sigma = 19\n",
    "\n",
    "mu_star = 0.0\n",
    "sigma_star = 4.0\n",
    "\n",
    "\n",
    "torch.manual_seed(1)\n",
    "\n",
    "theta = 0.01*torch.randn((dim,1))\n",
    "theta_star = mu_star + sigma_star*2*(torch.rand((dim,1))-0.5)\n",
    "#theta = -theta.abs()*theta_star.sign()\n",
    "theta_initial = torch.empty((dim,1)).copy_(theta)\n",
    "\n",
    "\n",
    "# PSD matrix generation\n",
    "D = torch.diag(mu*torch.ones(dim) + sigma*(torch.rand(dim)-0.5))      # eigen values\n",
    "\n",
    "angle = 2*math.pi*torch.rand(1).item()                                # uniformly distributed angle in dim 2\n",
    "cos = math.cos(angle)\n",
    "sin = math.sin(angle)\n",
    "b = 1 if torch.rand(1).item() > 0.5 else -1\n",
    "R = torch.tensor([[cos,     sin], \n",
    "                  [-b*sin, b*cos]], dtype=torch.float32)              # uniformly distributed rotation of O(2) \n",
    "\n",
    "for n in range(3, dim+1):                                             # sub group algorithm Shahshahani\n",
    "    print('n=', n, '  -->   det(R) =', torch.det(R).item())\n",
    "    e_1 = torch.zeros((n,1), dtype=torch.float32)\n",
    "    e_1[0,0] = 1\n",
    "    v = torch.randn((n,1), dtype=torch.float32)\n",
    "    v = v/(v.pow(2).sum().sqrt())\n",
    "    c = (e_1 - v).pow(2).sum().sqrt().item()\n",
    "    x = (e_1 - v)/c\n",
    "    refl = torch.eye(n, dtype=torch.float32) - 2*torch.mm(x, x.t())\n",
    "    A = torch.zeros((n,n), dtype=torch.float32)\n",
    "    A[0,0] = 1\n",
    "    A[1:,1:] = R\n",
    "    R = torch.mm(refl, A)\n",
    "\n",
    "\n",
    "print('det(R) =', np.linalg.det(R.numpy()))\n",
    "H = torch.mm(R.t(),torch.mm(D,R))\n",
    "H = (H + H.t())/2                                  # ensure symmetry despite numerical instability\n",
    "\n",
    "\n",
    "print('diagonal mass =', H.abs().diag().sum().item()/H.abs().sum().item())\n",
    "print('\\nH =', H)\n",
    "print('\\ntheta_star =', theta_star.t())\n",
    "\n",
    "eig_val, eig_vec = torch.symeig(H, eigenvectors=True, )\n",
    "print('\\neig_val =', eig_val)\n",
    "print('\\neig_vec =', eig_vec)\n",
    "\n",
    "assert(eig_val.min().item()>0)                     # ensure Positivity\n",
    "\n",
    "H_inv = torch.inverse(H)\n",
    "H_inv_normalised = H_inv/(H_inv.pow(2).sum(dim=0).pow(0.5))\n",
    "print('\\northogonality of H_inv(BC) =', torch.mm(H_inv_normalised.t(), H_inv_normalised))\n",
    "\n",
    "plt.hist(eig_val.numpy(),100)\n",
    "plt.show()\n",
    "plt.hist(theta_star.numpy(), 100)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "#SGD dim > 2\n",
    "\n",
    "traj = torch.empty((dim,num_epochs))\n",
    "loss = []\n",
    "\n",
    "for t in range(num_epochs):\n",
    "    theta = step_sgd(H, theta, theta_star, lr=lrate)\n",
    "    traj[:,t] = theta[:,0]\n",
    "    loss.append(cost(H, theta.sign(), theta_star))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "switch = torch.ones((dim,dim))-2*torch.eye(dim)\n",
    "max_magnitude = theta.abs().max().item()\n",
    "bins = 15\n",
    "\n",
    "theta_bin = theta.sign()\n",
    "final_cost = cost(H, theta_bin, theta_star)\n",
    "costs = []\n",
    "\n",
    "for d in range(dim):\n",
    "    theta_switched = switch[:,d].view(dim,1)*(theta_bin)\n",
    "    switched_cost = cost(H, theta_switched, theta_star)\n",
    "    costs.append(switched_cost-final_cost)\n",
    "\n",
    "costs_tensor = torch.tensor(costs, dtype=torch.float32).view(-1,1)\n",
    "\n",
    "hidden_magnitude = []\n",
    "costs_mean = []\n",
    "costs_std = []\n",
    "\n",
    "for k in range(bins):\n",
    "    indices = (theta.abs() > (k/bins)*max_magnitude)*(theta.abs() < ((k+1)/bins)*max_magnitude)\n",
    "    costs_mean.append(costs_tensor[indices].mean().item())\n",
    "    costs_std.append(costs_tensor[indices].std().item())\n",
    "    hidden_magnitude.append(theta[indices].abs().mean().item()/max_magnitude)\n",
    "\n",
    "\n",
    "\n",
    "fig = plt.figure(figsize=(10,7))\n",
    "plt.errorbar(hidden_magnitude, costs_mean, yerr=costs_std, fmt='o', ms=10, mew=4)\n",
    "axes = plt.gca()\n",
    "label_pad = 5\n",
    "\n",
    "plt.text(0, 175, '(b) Quadratic Binary Task', fontsize=35)\n",
    "\n",
    "axes.set_xlabel(r'$|W^{{\\rm h}}|/W^{{\\rm h}}_{{\\rm max}}$', fontsize = 35)\n",
    "axes.xaxis.set_ticks(list(np.linspace(0.0,1.0,5)))\n",
    "axes.xaxis.set_tick_params(direction = 'in', labelsize = 35, length = 10, width = 4, top = True, bottom = True, pad = label_pad, which = 'major')\n",
    "axes.xaxis.set_tick_params(direction = 'in', labelsize = 35, length = 6, width = 3, top = True, bottom = True, pad = label_pad, which = 'minor')\n",
    "\n",
    "axes.set_ylabel(r'$\\Delta \\mathcal{L}$', fontsize = 35)\n",
    "axes.yaxis.set_tick_params(direction = 'in', labelsize = 35, length = 10, width = 4, right = True, left = True, pad = label_pad, which='major')\n",
    "axes.yaxis.set_tick_params(direction = 'in', labelsize = 35, length = 6, width = 3, right = True, left = True, pad = label_pad, which='minor')\n",
    "\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
